package control;

import dao.ProductoDAO;
import entidad.Producto;
import java.util.ArrayList;

public class ControlProducto {
    
    private ProductoDAO dao;

    public ControlProducto() {
        dao = new ProductoDAO();
    }
    
    public String agregar(Producto producto) {
        if (!verificarLongitudNombre(producto.getNombre())) {
            return "Nombre incorrecto";
        }
        if (!verificarLongitudCodigo(producto.getCodigo())) {
            return "Longitud de código incorrecta";
        }
        if (!verificarLongitudMarca(producto.getMarca())) {
            return "Longitud de marca incorrecta";
        }
        if (!verificarCodigo(producto)) {
            return "Ya existe el producto";
        }
        dao.crear(producto);
        return "Producto agregado exitosamente!";
    }

    public String modificar(Producto producto) {
        /*
         * modificacion de algun campo de producto
         * Campos modificables:
         * Nombre, y marca del producto
         */

        if (!verificarLongitudNombre(producto.getNombre())) {
            return "Nuevo nombre incorrecto";
        }
        if (!verificarLongitudMarca(producto.getMarca())) {
            return "Nueva marca incorrecta";
        }
//        for (Producto temp : sistema.getProductos()) {
//            if (temp.getCodigo() == producto.getCodigo()) {
//                sistema.getProductos().remove(temp);
//                sistema.getProductos().add(producto);
//            }
//        }
        dao.actualizar(producto, producto);
        return "Producto modificado exitosamente!";
    }
    
    public boolean eliminar(Producto producto) {
        return dao.eliminar(producto);
    }

    public boolean verificarLongitudNombre(String nombre) {
        return (nombre.length() >= 3 && nombre.length() <= 30);
    }

    public boolean verificarLongitudCodigo(Long codigo) {
        return codigo >= 7700000000000l && codigo <= 77099999999999l;
    }

    public boolean verificarLongitudMarca(String marca) {
        return (marca.length() >= 3 && marca.length() <= 20);
    }

    public ArrayList<Producto> buscar(String str) {
        ArrayList<Producto> ret = new ArrayList<>();

        if(str.equals("")) dao.buscar("");
        
        String[] split = str.split(" ");
        for (int i=0; i<split.length; i++) {
            split[i] = split[i].trim();
            if (split[i].equals("")) continue;
            
            ArrayList<Producto> aux = dao.buscar(split[i]);            
            for (Producto p : aux) if (!ret.contains(p)) ret.add(p);
        }
        return ret;
    }

    private boolean verificarCodigo(Producto producto) {
        return (dao.leer(producto)==null);
    }

    public boolean esLong(String cad) {
        for (int i = 0; i < cad.length(); i++) {
            if (!Character.isDigit(cad.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    private boolean validarDominioDeDatos(String codigo) {
        return esLong(codigo);
    }

    public String validarCampos(String codigo) {
        if (!validarDominioDeDatos(codigo)) {
            return "El campo código solo admiten valores numéricos";
        }
        return "";
    }
}
